/**
 * 代理模式
 */
//  给某一个对象提供一个代理，并由代理对象控制对原对象的引用。
interface IPerson {
    eat(): void;
    sleep(): void;
}
class Person implements IPerson {
    eat() {
        console.log('我在吃饭');
    }
    sleep() {
        console.log('我在睡觉');
    }
}

class PersonProxy implements IPerson {
    private readonly person: Person;
    constructor(person: Person) {
        this.person = person;
    }
    eat() {
        console.log('这个人吃东西');
        this.person.eat();
    }
    sleep() {
        console.log('这个人睡觉');
        this.person.sleep();
    }
}
const person = new Person();
const proxy = new PersonProxy(person);
proxy.eat();
proxy.sleep();
// 这就是代理模式的一个应用，除了 打印日志，它还可以用来做权限管理。
// 读者看到这里可能已经发现了，这个代理类看起来和装饰模式的 FilterInputStream 一模一样，
// 但两者的目的不同，装饰模式是为了 增强功能或添加功能，代理模式主要是为了加以控制。

// --
// 单例 + Proxy 实现动态代理;
